package model

import (
	"time"

	"github.com/pkg/errors"

	"bilinadmin/pkg/util"
)

const (
	// StoreStatusOk 正常
	StoreStatusOk int8 = 1
	// StoreStatusBlocked 停用
	StoreStatusBlocked int8 = 2
	// ok
	StoreStatusOkStr string = "ok"
	// blocked
	StoreStatusBlockedStr string = "blocked"
)

var InvalidStatus = errors.New("invalid status enum")

type Store struct {
	Id int64 `json:"id" sql:"id"`
	// 品牌id
	BrandId int64 `json:"brand_id" sql:"brand_id"`
	// 门店名
	Name string `json:"name" sql:"name"`
	// 联系人
	ContactName string `json:"contact_name" sql:"contact_name"`
	// 联系方式
	ContactMobile string `json:"contact_mobile" sql:"contact_mobile"`
	// 门店经营范围, 行政编码
	BusinessScope string `json:"business_scope" sql:"business_scope"`
	// 门店地址区级行政编码
	DistrictCode string `json:"district_code" sql:"district_code"`
	// 省市区号（电话区号)
	RegionCode string `json:"region_code" sql:"region_code"`
	// 门店地址
	Address string `json:"address" sql:"address"`
	// 纬度
	Latitude float64 `json:"latitude" sql:"latitude"`
	// 经度
	Longitude float64 `json:"longitude" sql:"longitude"`
	// 状态
	Status int8 `json:"status" sql:"status"`
	// 超级管理员
	SupEmpId int64 `json:"sup_emp_id" sql:"sup_emp_id"`
	// 创建员工id
	ModifyEmpId int64 `json:"modify_emp_id" sql:"modify_emp_id"`
	// 创建时间
	CreatedAt time.Time `json:"created_at" sql:"created_at"`
	// 更新时间
	UpdatedAt time.Time `json:"updated_at" sql:"updated_at"`
	// 删除时间
	DeletedAt int64 `json:"deleted_at" sql:"deleted_at"`
}

// NewStore 新建门店
func NewStore(brandId int64, name, contactName, contactMobile, busScope, DisCode, regionCode, addr string, lat, lng float64, creator int64) *Store {
	now := util.GetNow()
	return &Store{
		BrandId:       brandId,
		Name:          name,
		ContactName:   contactName,
		ContactMobile: contactMobile,
		BusinessScope: busScope,
		DistrictCode:  DisCode,
		RegionCode:    regionCode,
		Address:       addr,
		Latitude:      lat,
		Longitude:     lng,
		Status:        StoreStatusOk,
		SupEmpId:      creator,
		ModifyEmpId:   creator,
		CreatedAt:     now,
		UpdatedAt:     now,
	}
}

func (s *Store) IsValid() bool {
	return s.Status == StoreStatusOk && s.DeletedAt == 0
}

// GetInnerStoreStatus 内部状态枚举
func GetInnerStoreStatus(st string) int8 {
	switch st {
	case StoreStatusOkStr:
		return StoreStatusOk
	case StoreStatusBlockedStr:
		return StoreStatusBlocked
	default:
		return 0
	}
}

// SetStatus 设置状态
func (s *Store) SetStatus(st string) error {
	switch st {
	case StoreStatusOkStr:
		s.Status = StoreStatusOk
	case StoreStatusBlockedStr:
		s.Status = StoreStatusBlocked
	default:
		return InvalidStatus
	}
	return nil
}

// GetStatus 获取状态
func (s *Store) GetStatus() string {
	switch s.Status {
	case StoreStatusOk:
		return StoreStatusOkStr
	case StoreStatusBlocked:
		return StoreStatusBlockedStr
	default:
		return ""
	}
}

// AssignSumEmp 更新超级管理员
func (s *Store) AssignSumEmp(empId int64) {
	s.SupEmpId = empId
	s.UpdatedAt = util.GetNow()
}

// Update 更新门店信息
func (s *Store) Update(name, contactName, contactMobile, busScope, disCode, regionCode, addr string, lat, lng float64) {
	if name != "" {
		s.Name = name
	}
	if contactName != "" {
		s.ContactName = contactName
	}
	if contactName != "" {
		s.ContactName = contactName
	}
	if contactMobile != "" {
		s.ContactMobile = contactMobile
	}
	if busScope != "" {
		s.BusinessScope = busScope
	}
	if disCode != "" {
		s.DistrictCode = disCode
	}
	if regionCode != "" {
		s.RegionCode = regionCode
	}
	if addr != "" {
		s.Address = addr
	}
	if lat != 0 {
		s.Latitude = lat
	}
	if lng != 0 {
		s.Longitude = lng
	}
	s.UpdatedAt = util.GetNow()
}
